import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


// 通过这个类，把数据库连接封装一下
// 此处把这个 DBUtil 作为一个工具类，提供 static 静态方法，供其他代码调用
public class DBUtil {
    // 静态成员变量跟随类对象，类对象在整个进程中只有一份
    // 静态成员相当于也是唯一的实例。(单例模式，饿汉模式)
    private static DataSource dataSource = new MysqlDataSource();

    // 静态代码块，静态块用于初始化类，为类的属性初始化。每个静态代码块只会执行一次。
    // 什么时候用？
    // 如果有些代码必须在项目启动的时候就执行，那么我们就可以使用静态代码块来实现，这种代码是主动执行的。
    // 针对dataSource进行初始化操作
    static {
//         注意 数据库的名字要写对,
        /** .......................
         千万要注意如果是往数据库中添加汉字的话，不要忘记设置字符集，不然会报错的
        */
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/messageWall?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
    }

    // 通过这个方法建立连接
    public static Connection getConnection() throws SQLException {
        // 什么意思？？？？？？？？？
        return dataSource.getConnection(); // 注意这个不是上面那行代码的 getConnection()，而是 dataSource的方法getConnection（）
    }

    // 断开连接，释放资源
    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
        // 此处的三个 try catch 分开写更好, 避免前面的异常导致后面的代码不能执行.
        if(resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
